/**
 * @desc
 * 整合config、http、router、antd
 */

// antd组件全局推导
import Antd, { notification } from 'ant-design-vue'

// 样式重置
import './base.css'

import { initConfig } from '@framework/useConfig'
import type { App } from 'vue'
import { createApp } from 'vue'
import { autoImportComponent } from '@framework/useAutoImport'
import useProjectRouter from '@framework/useProjectRouter'
import { initHttp } from '@framework/useProjectHttp'
import useAppName from '@framework/useAppName'
import useLog from '@framework/useLog'
import AppVue from './App.vue'
import userConf from '@/../config/application.yml'

let _app: App<Element>

/**
 * 创建一个app，有且仅能创建一个app
 * @param options
 * @returns
 */
function createProjectApp<T>(options: {
  App: any
}) {
  if (_app)
    return _app
  const { App } = options
  const conf = userConf
  // 初始化框架配置文件
  const projectConfig = initConfig<T>(conf)
  useLog().log('项目名称=>', useAppName())
  useLog().log('项目配置=>', projectConfig)
  // 初始化路由
  const { router } = useProjectRouter()

  // 初始化框架http库
  initHttp({
    tipError: (msg) => {
      notification.error({ message: msg })
    },
  })

  // 初始化APP
  const app = createApp(App)
  // 全局组件 自动注册
  autoImportComponent(app)
  // 初始化router
  app.use(router)
  _app = app
  _app.use(Antd)
  _app.mount('#app')

  return app
}

/**
 * 返回整个项目的app模块，整个项目当且仅有一个app实例，不会重复创建
 * @returns
 */
export default function () {
  if (_app)
    return _app
  _app = createProjectApp({ App: AppVue })
  return _app
}
